home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 3 / BBS in a box - Trilogy III.iso / Files / Prog / U-Z / YACC / calculator.y next >
Encoding:
Lex Description  |  1990-11-05  |  1.2 KB  |  73 lines  |  [TEXT/KAHL]

  1. %{
  2. #include    <stdio.h>
  3. #include    <ctype.h>
  4. #include    <console.h>
  5.  
  6. #define    YYDEBUG
  7. #define    YYSTYPE    long
  8. %}
  9.  
  10. %token DIGIT
  11. %left '+' '-'
  12. %left '*' '/'
  13. %start    line
  14.  
  15. %%
  16.  
  17. line    :    '\n' /* nothing */    { YYACCEPT; }
  18.         |    expr '\n'            { printf("::%ld\n", $1); YYACCEPT; }
  19.         ;
  20.  
  21. expr    :    expr '+' term        { $$ = $1 + $3; }
  22.         |    expr '-' term        { $$ = $1 - $3;    }
  23.         |    term
  24.         ;
  25. term    :    term '*' factor        { $$ = $1 * $3; }
  26.         |    term '/' factor     { $$ = $1 / $3;    }
  27.         |    factor
  28.         ;
  29. factor    :    '(' expr ')'        { $$ = $2; }
  30.         |    '-' '(' expr ')'    { $$ = - ($3); }
  31.         |    '-'    DIGIT            { $$ = - ($2); }
  32.         |    DIGIT
  33.         ;
  34. %%
  35. main() {
  36. #ifdef    YYDEBUG
  37.     extern    int    yydebug;
  38.     yydebug = 1;
  39.     console_options.nrows = 14;
  40.     cecho2file("ddy.log", 0, stdout);
  41. #endif
  42.     printf("\n>>");
  43.     while(true) {
  44.         yyparse();
  45.         printf("\n>>");
  46.         }
  47.     }
  48.  
  49. yylex() {
  50.     int c;
  51.     
  52. skip:
  53.     if(isdigit( (c = getchar() ) ) ) {
  54.         yylval = c - '0';
  55.         while(isdigit( (c = getchar() ) ) ) {
  56.             yylval = yylval * 10 + (c - '0');
  57.             }
  58.         ungetc(c, stdin);
  59.         return DIGIT;
  60.         }
  61.     if(strchr("+-*/()\n", c) == NULL) {
  62.         printf("LEXERROR illegal token '%c'\n", c);
  63.         goto skip;
  64.         }
  65.     return c;
  66.     }
  67.  
  68. yyerror(s) char *s; {
  69.     extern    int yychar, yyerrflag;
  70.     fprintf( stderr, (char *)"YACCERR %d: %s\n",
  71.         yyerrflag, s);
  72.     }
  73.